﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web.Hosting;
using System.Web.Caching;
using System.Data;
using System.Web;
using System.Security.Permissions;

namespace CspV1
{
    [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    public class SampleVirtualFile : VirtualFile
    {
        private string content;
        private SamplePathProvider spp;

        public bool Exists
        {
            get { return (content != null); }
        }

        public SampleVirtualFile(string virtualPath, SamplePathProvider provider)
            : base(virtualPath)
        {
            this.spp = provider;
            GetData();
        }

        protected void GetData()
        {
            // Get the data from the SamplePathProvider
            DataSet ds = spp.GetVirtualData();

            // Get the virtual file from the resource table.
            DataTable files = ds.Tables["resource"];
            DataRow[] rows = files.Select(String.Format("(name = '{0}') AND (type='file')", this.Name));

            // If the select returned a row, store the file contents.
            if (rows.Length > 0)
            {
                DataRow row = rows[0];
                content = row["content"].ToString();
            }
        }

        private string FormatTimeStamp(DateTime time)
        {
            return String.Format("{0} at {1}",
              time.ToLongDateString(), time.ToLongTimeString());
        }

        public override Stream Open()
        {

            //if (this.Name.ToLower().EndsWith(".aspx"))
            //{
            //    string script = "<%@ Page Language=\"C#\" %>";
            //      script+=  "<%=DateTime.Now.ToShortTimeString() + \"<br />\" %>";

            //      Stream s = new MemoryStream();
            //      if (script != null || script.Equals(String.Empty))
            //      {
            //          // Put the page content on the stream.
            //          StreamWriter w = new StreamWriter(s);
            //          w.Write(script);
            //          w.Flush();
            //          s.Seek(0, SeekOrigin.Begin);
            //      }
            //      return s;
            //}
             if (this.Name.ToLower().EndsWith(".aspx"))
            {
                string script = "<%@ Page Title=\"\" Language=\"C#\" MasterPageFile=\"~/vrdir/Site1.Master\" AutoEventWireup=\"true\" CodeBehind=\"WebForm2.aspx.cs\" Inherits=\"CspV1.WebForm2\" %>";
                  script+=  "<asp:Content ID=\"Content1\" ContentPlaceHolderID=\"head\" runat=\"server\">";
                    script+=  "</asp:Content><asp:Content ID=\"Content2\" ContentPlaceHolderID=\"ContentPlaceHolder1\" runat=\"server\"></asp:Content>";
                  Stream s = new MemoryStream();
                  if (script != null || script.Equals(String.Empty))
                  {
                      // Put the page content on the stream.
                      StreamWriter w = new StreamWriter(s);
                      w.Write(script);
                      w.Flush();
                      s.Seek(0, SeekOrigin.Begin);
                  }
                  return s;
            }

            

            if (this.Name.ToLower().EndsWith(".master"))
            {
                //string script = "<%@ Page Language=\"C#\" %>";
                //script += "<%=DateTime.Now.ToShortTimeString() + \"<br />\" %>";

                //TextReader masterreader = new StreamReader("data/Site1.Master");  //Parser Error Message: Could not find a part of the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\data\Site1.Master'.
                string masterfile = HostingEnvironment.ApplicationPhysicalPath + "data/Site1.Master";
                TextReader masterreader = new StreamReader(masterfile);  

                string masterscript = masterreader.ReadToEnd();

                Stream s = new MemoryStream();
                if (masterscript != null || masterscript.Equals(String.Empty))
                {
                    // Put the page content on the stream.
                    StreamWriter w = new StreamWriter(s);
                    w.Write(masterscript);
                    w.Flush();
                    s.Seek(0, SeekOrigin.Begin);
                }
                return s;
            
            }


            string templateFile = HostingEnvironment.ApplicationPhysicalPath + "App_Data\\template.txt";
            string pageTemplate;
            DateTime now = DateTime.Now;

            // Try to get the page template out of the cache.
            pageTemplate = (string)HostingEnvironment.Cache.Get("pageTemplate");

            if (pageTemplate == null)
            {
                // Get the page template.
                using (StreamReader reader = new StreamReader(templateFile))
                {
                    pageTemplate = reader.ReadToEnd();
                }

                // Set template timestamp
                pageTemplate = pageTemplate.Replace("%templateTimestamp%",
                  FormatTimeStamp(now));

                // Make pageTemplate dependent on the template file.
                CacheDependency cd = new CacheDependency(templateFile);

                // Put pageTemplate into cache for maximum of 20 minutes.
                HostingEnvironment.Cache.Add("pageTemplate", pageTemplate, cd,
                  Cache.NoAbsoluteExpiration,
                  new TimeSpan(0, 20, 0),
                  CacheItemPriority.Default, null);
            }

            // Put the page data into the template.
            pageTemplate = pageTemplate.Replace("%file%", this.Name);
            pageTemplate = pageTemplate.Replace("%content%", content);

            // Get the data time stamp from the cache.
            DateTime dataTimeStamp = (DateTime)HostingEnvironment.Cache.Get("dataTimeStamp");
            pageTemplate = pageTemplate.Replace("%dataTimestamp%",
              FormatTimeStamp(dataTimeStamp));
            pageTemplate = pageTemplate.Replace("%pageTimestamp%",
              FormatTimeStamp(now));

            // Put the page content on the stream.
            Stream stream = new MemoryStream();
            StreamWriter writer = new StreamWriter(stream);

            writer.Write(pageTemplate);
            writer.Flush();
            stream.Seek(0, SeekOrigin.Begin);

            return stream;
        }
    }

}
